<?php
/**
 * Fluxo de Desvinculação a Pedido
 * @author bruno
 * @since 28/04/2010
 */
class FluxoDesvinculacaoPedido extends BaseFluxoDesvinculacao implements InterfaceFluxo
{
    public static function solicitar(CandidatoVaga $candidatoVaga, $txtDataDemissao)
    {
        self::isAuthorized('solicitar', $candidatoVaga, TRUE);
        
        try {
        	pg_query(conexao::Conectar(), 'begin');
        	
        	$candidatoVaga->inserirHistorico(Status::Devolucao_Pedido_Solicitado);
        	$candidatoVaga->demissao = $txtDataDemissao;
        	$candidatoVaga->salvar();
        	
        	pg_query(conexao::Conectar(), 'commit');
        }
        
        catch (Exception $e) {
        	pg_query(conexao::Conectar(), 'rollback');
        	throw new Exception($e->getMessage());
        }
        
    }
    
    public static function encaminharSemSubstituicao(CandidatoVaga $candidatoVaga, $parecer)
    {
        self::isAuthorized('encaminharSemSubstituicao', $candidatoVaga, TRUE);
        $candidatoVaga->inserirHistorico(Status::Devolucao_Pedido_EncaminhadoSemSubstituicao, $parecer);
    }
    
    public static function encaminharComSubstituicao(CandidatoVaga $candidatoVaga, $parecer)
    {
        self::isAuthorized('encaminharComSubstituicao', $candidatoVaga, TRUE);
        $candidatoVaga->inserirHistorico(Status::Devolucao_Pedido_EncaminhadoComSubstituicao, $parecer);
    }
    
    public static function confirmar(CandidatoVaga $candidatoVaga)
    {
        self::isAuthorized('confirmar', $candidatoVaga, TRUE);
        
        try {
            pg_query(conexao::Conectar(), 'begin');
            
            $vaga = $candidatoVaga->getVaga();
            if ($candidatoVaga->getStatusAtual() == Status::Devolucao_Pedido_EncaminhadoComSubstituicao) {
                $vaga->statusid = Status::Vaga_AContratar;
                $vaga->salvar();
            }
            else {
                $vaga->resetarVaga(TRUE);
            }
            
            $candidatoVaga->inserirHistorico(Status::Devolucao_Pedido_Confirmado);
            
            $candidatoVaga->ativo = FALSE;
     		$candidatoVaga->salvar();
     		
     		pg_query(conexao::Conectar(), 'commit');
        }
        catch (exception $e) {
            pg_query(conexao::Conectar(), 'rollback');
            throw new Exception($e->getMessage());
        }
    }
    
    public static function isAuthorized($operacao, CandidatoVaga $candidatoVaga, $throwExceptions = FALSE)
    {
        $vaga     = $candidatoVaga->getVaga();
        $statusid = $candidatoVaga->getStatusAtual();
        $contrato = $vaga->getContrato();
        
        global $pfcid;
        
        
        if (!$contrato->podeMovimentarCandidatos()) {
            if ($throwExceptions) {
                throw new Exception('Não é possível realizar esta operação, pois o contrato não está confirmado.');
            }
            return FALSE;
        }
        
        if ($vaga->statusid != Status::Vaga_Ocupada) {
            if ($throwExceptions) {
                throw new Exception('Não é possível realizar esta operação, pois a vaga não está ocupada.');
            }
            return FALSE;
        }
        
        switch ($operacao) {
            case 'solicitar':
                if ($statusid == Status::Candidato_ContratacaoFinalizada AND 
                $pfcid == PerfilComportamental::Empresa) {
                    return TRUE;
                }
                break;
                
            case 'encaminharSemSubstituicao':
                if ($statusid == Status::Devolucao_Pedido_Solicitado 
                AND $pfcid == PerfilComportamental::NucleoGestor 
                AND !$vaga->hasSelecaoAtiva()) {
                    return TRUE;
                }
                break;
                
            case 'encaminharComSubstituicao':
                if ($statusid == Status::Devolucao_Pedido_Solicitado AND 
                $pfcid == PerfilComportamental::NucleoGestor) {
                    return TRUE;
                }
                break;
                
            case 'confirmar':
                if (
                       (
                           $statusid == Status::Devolucao_Pedido_EncaminhadoComSubstituicao
                            OR $statusid == Status::Devolucao_Pedido_EncaminhadoSemSubstituicao
                        ) 
                        AND $pfcid == PerfilComportamental::Empresa
                    ) {
                    return TRUE;
                }
                break;
        }
        if ($throwExceptions) {
            throw new Exception(self::ERRO_AUTORIZACAO);
        }
        return FALSE;
    }
}